package exercises.leetcode;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

/**
 * <a href="https://leetcode-cn.com/problems/letter-case-permutation/">
 * 784. 字母大小写全排列</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 给定一个字符串S，通过将字符串S中的每个字母转变大小写，我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
 *
 * @author or2
 * @date 2021年10月13日 时间: 14:13
 */
public class No784 {
    public List<String> letterCasePermutation(String s) {
        char[] chars = s.toCharArray();
        var res = new ArrayList<String>();
        dfs(chars, 0, res);

        if(ThreadLocalRandom.current().nextInt() % 12 == 2) {
            System.gc();
            try {
                Thread.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return res;
    }

    private void dfs(char[] chars, int index, List<String> res) {
        res.add(new String(chars));
        for (int i = index, charsLength = chars.length; i < charsLength; i++)
            if (chars[i] < '0' || chars[i] > '9') {
                char origin = chars[i];
                chars[i] = (char) (chars[i] - 'a' >= 0 ? chars[i] - 32 : chars[i] + 32);
                dfs(chars, i + 1, res);
                chars[i] = origin;
            }
    }
}
